//加载相关依赖包
//gulp依赖包
const gulp = require('gulp');
//css需要的依赖包
const autoprefixer = require('gulp-autoprefixer');
const cssmin = require('gulp-cssmin');
//js需要的依赖包
const babel = require('gulp-babel');
const uglify = require('gulp-uglify');
//html 需要的依赖包
const htmlmin = require('gulp-htmlmin');
//服务器依赖包
const webserver = require('gulp-webserver');
//删除程序依赖包    
const del = require('del');
//sass 依赖包
const sass = require('gulp-sass');
const autoPrefixer = require('gulp-autoprefixer');



//设定打包压缩规范
//css打包规范语法
const cssHandler = function(){
    return gulp.src('./src/css/*.css')  //指定 执行打包压缩的文件路径
    .pipe(autoprefixer())   //对src获取的文件 执行 添加前缀规范
    .pipe(cssmin()) //对 src 获取的文件 执行 添加前缀之后 执行打包压缩
    .pipe(gulp.dest('./dist/css')); //将 执行了 打包压缩规范之后的文件 指定 存储位置
}

//sass打包规范
const sassHandler = function(){
    return gulp.src('./src/sass/*.scss')
    .pipe(sass())
    .pipe(autoPrefixer())
    .pipe(cssmin())
    .pipe(gulp.dest('./dist/css'))
}





//js 打包规范
const jsHandler = function(){
    return gulp.src('./src/js/*.js')  //指定 执行打包压缩的文件路径
    .pipe(babel({presets:['@babel/env']}))   //其他版本的js语法 转化为es5语法
    .pipe(uglify()) //将ES5语法的js程序 打包压缩
    .pipe(gulp.dest('./dist/js')); //将 执行了 打包压缩规范之后的文件 指定 存储位置
}

//html打包规范
const htmlHandler = function(){
    return gulp.src('./src/pages/*.html')
    .pipe(htmlmin({ //以对象的形式设定thml打包压缩参数
        removeAttributeQuotes:true, //删除属性中的双引号
        removeComments:true,    //删除注释
        // removeEmptyAttributes:true,  //上次空属性
        removeEmptyElements:true,   //删除空标签
        removeScriptTypeAttributes:true,    //删除 script 标签的type 属性
        removesStyleLinkTypeAttibutes:true, //删除 link 标签的 type属性
        coollapseBooleanAttributes:true,    //删除布尔属性的属性值
        coollapseWhitespace:true,   //删除标签之间的空格
        minifyJS:true,  //压缩内容js程序
        minifyCSS:true, //压缩内部css 程序
    })).pipe(gulp.dest('./dist/pages')) //压缩后的文件在指定文件夹内
}


//不需要打包，直接读取复制存储的文件程序
//图片，音频，视频 后端程序 已经压缩好的程序
//图片
const imageHandler = function(){
    return gulp.src('./src/message/**').pipe(gulp.dest('./dist/message'));

}
//后端程序
const phpHandler = function(){
    return gulp.src('./src/server/**').pipe(gulp.dest('./dist/server'));
}
//工具程序
const toolsHandler = function(){
    return gulp.src('./src/tools/**').pipe(gulp.dest('./dist/tools'));
}


//设定删除程序
const delHandler = function(){
    return del(['./dist']);
}

//设定监听程序
const watchHandler = function(){
    gulp.watch('./src/css/*.css',cssHandler);
    gulp.watch('./src/sass/*.scss',sassHandler);
    gulp.watch('./src/js/*.js',jsHandler);
    gulp.watch('./src/pages/*.html',htmlHandler);
    gulp.watch('./src/message/**',imageHandler);
    gulp.watch('./src/server/**',phpHandler);
    gulp.watch('./src/tools/**',toolsHandler);
}


//配置 gulp 的 服务器
const webserverHandler = function(){
    return gulp.src('./dist')   //运行的是 打包压缩的文件 路径是 dist文件夹
    .pipe(webserver({
        host:'127.0.0.1',   //服务器IP地址
        port:'8080',    //服务器端口
        open:'./pages/index.html',  //默认的首页面，相对路径是从 dist 文件夹开始的
        livereload:true,    //开启热启动 只有服务器中 文件内容改变 自动刷新
    }))
} 


//设定 导出 默认执行程序
//之前运行文件的命令是 node gulpfile.js
//设定导出默认程序之后 命令是 gulp 会自动执行 gulpfile.js 文件程序
module.exports.default = gulp.series(
    delHandler, //限制性删除原始压缩文件操作
    gulp.parallel( cssHandler ,sassHandler, jsHandler , htmlHandler , imageHandler , phpHandler , toolsHandler ), 
                            //先执行一次打包压缩规范
    webserverHandler,   //  开启服务器
    watchHandler,   //执行监听 如果 文件内容有改变 自动再次执行 打包压缩规范
)